学习笔记 - DNN for YouTube Recommendations

Deep Neural Networks for YouTube Recommendations是Google发表在Recsys2016上的一篇论文,是将深度学习技术应用于工业推荐场景的经典文章。这篇随笔记录了博主在阅读该文章时的一些理解…

recsys_framework

1.推荐系统框架

如封面图所示,工业级个性化推荐架构往往通常包含召回(recalling.或称candidate generation)和排序(ranking)两层。召回层负责从海量的候选池中初步圈出用户比较感兴趣的候选集,排序层则对召回的候选进行精确打分,从中取topK后呈现给用户。这样的设计架构有如下一些思路:

  1. 个性化推荐的本质是个topK问题,即通过模型、规则等方法,基于用户信息(user info)和上下文(context info),选择最合适的K个候选推给用户。要获得topK,直观的思路就是对每一个候选按用户+上下文进行个性化打分,然后截选前K个。为使得打分准确,推荐系统中普遍采用多特征+大模型来计算,由此引入的计算开销会很大

  2. 在候选规模大时(如youtube的视频、ins的图文、tiktok的短视频等场景的候选量级往往过亿),系统无法承受对每个候选过一遍个性化模型带来的开销,于是将系统拆分为两层:召回和排序。召回层负责从海量候选池中选出一个规模较小的候选集,排序层则负责对这部分候选进行精确的个性化打分,进而得出目标topK。

  3. 即任务拆解为:召回 –> 快速高效生成小候选集,排序 –> 精准打分排出topK。

  4. 进一步考虑,召回候选集的好坏(个性化匹配程度),直接决定着排序效果,在召回中引入相对较轻的个性化模型,是目前推荐的主流。如本文,就采用了DNN进行离线学习,并由此实现个性化召回。

2.召回

2.1 问题建模

本文将召回阶段的基本问题归纳为:给定某时刻t下用户侧信息U和上下文信息C,预测用户最有可能观看那个视频,由此选出可能性前N的候选集。即对候选i,预测其会被用户观看的概率P(wt=i|U,C),据此选出topN。

如前图所示,文中采用MLP+Softmax来对该预测问题进行建模;输出时每一个候选video被视作一类,整体被视作多分类模型。

  • 输入包含U(user)、C(context)、V(video)等不同维度特征,其中对稀疏特征(如观看历史、搜索历史等id类特征…)进行了embedding转换;多路特征向量拼接得到MLP的输入层。

  • 经过多隐层(relu激活)之后输出一个向量,视作user_vector;经过softmax层,得到每个候选的预测概率,概率计算如下式:

  • softmax层的每一维输出,对应视频i被观看的概率Pi,召回的目标即是P最大的前N个视频。观察上式可知,在user_vector=u不变的情况下,概率Pi的大小仅取决于向量内积vi*u,其中vi是softmax第i维输出权重,视作video_vector

  • 内积v*u刻画了user_vector和video_vector两个向量间的相似程度,实质上将召回过程具象成在video_vector空间搜索与user_vector最相近的N个videos。在线服务时,可采用近邻搜索的方法加速这一过程,即文中的nearest neighbor index的思路。

2.2 softmax

softmax层的设置将核心问题转化为了多分类问题,考虑到候选的规模很大,该分类被称作超大规模多分类extreme multiclass)。显然,超大规模多分类面临着工程实现上的挑战。

先分析下softmax层的训练机制:

  • 假设训练时有一条正例样本[f1,f2,…|wt=i](用户在t时刻对视频i有点击行为),则整个softmax的输出labels=(0,…,0,1,0,…,0),即第i类为1,其他全为0;

  • 输入特征经过MLP得出user_vector,然后通过softmax计算得出每一类的预测概率,即softmax的输出preds=(p1,…,pi,…,pn);

  • 基于labels和preds可计算此次预测的损失(如交叉熵loss),然后通过反向传播算法更新softmax层权重(video_vectors)以及底层的MLP参数。

在上述过程中,为计算出每一类的输出P,需要先算出softmax的归一化分母,包括user_vector和所有video_vector间的内积,随之而来的就是巨大的计算开销

为缓解计算压力以加快训练,减少负样本的数量-->降低输出维度-->降低softmax计算量-->加快BP参数更新是一种可行的思路。本文即采用了重要性采样(importance samping)的方法来生成负样本,从而在较小的输出维度上进行计算,加快训练效率。

对于其中的具体实现,举个简单栗子:训练时对于每一条正样本vi,以videos的播放次数为重要性权值,从海量候选池中采样出指定数量个vj(j≠i)作为同批的负样本,构成样本块[f1,f2,…|Post={i},Negt={j1,j2,…,jm}],在该块上进行softmax计算,并通过反向传播更新对应的softmax输出维权重和MLP参数。整个过程相较于全量的计算来说可以实现成百上千倍的训练加速。

2.3 近邻搜索

在线召回时(serving),理论上可直接采用训练得到的模型进行前向计算,选出预测概率(无须归一化)最大的那N个候选。但我们说,这并不是最优的,本文即提到了一种主流的优化思路:近邻搜索

如前面叙述的那样,基于softmax获取召回结果的最后一步是计算user_vector与video_vector的内积,然后取topN。此内积用于刻画两个向量的相似度,与user_vector越相似的video_vector所对应的video越应该被召回。问题由此转化为搜索user_vector最相近的N个video_vector。该类近邻搜索的方法有很多,如kd-tree、LSH、HNSW等等。

举个栗子:(near-line)用候选的video_vectors离线构建kd-tree,(on-line)在线召回时,由模型前向计算得到user_vector并传入kd-tree,返回最相近的N个video_vectors对应的videos。

2.4 模型消偏技巧

推荐模型常倾向于出高热度的内容而非个性化的内容,倾向于出旧的经过充分学习的内容而非新内容等等,这种偏差(bias)需要尽量克服,以保证推荐的个性化、时效性…这部分的探索被称为模型消偏。

本文召回部分提到了一些小的技巧,对模型消偏有较大的帮助:

  • 每个用户样本数固定;e.g. 用户A每天产生10条训练正例、用户B每天产生1000条,则在天级训练时都只取至多20条样本。这样做的主要目的是消偏,缓解对高频用户过度学习带来的bias。

  • 加入example_age特征,文中将其描述为样本的生成时间;youtube很多类型的视频有着较强的时效性,example_age的引入使得模型能够较好的刻画这类特点。

  • 采用future watch作为模型训练对象;文中提到,用户的兴趣往往由大至小,比如说用户A先爱看一些全局热点,慢慢地会倾向于看一些细分垂直的兴趣内容,采用held-out训练方式会比较粗糙,替之以future watch的label更切合实际用户习惯。

3.精排

文中以期望观看时长(expected watch_time)为预测目标,采用weighted-LR分类器进行训练。训练样本从客户端展现给用户的视频中产生,正例是其中有点击观看的行为的视频,负例是未点击的视频。训练时,对于正例,以观看时长作为权重,可得出LR的odds=sum(Ti)/(N-k),由此计算loss做BP。

4.小结&参考

本文所阐述的推荐架构和相关方法,已广泛应用于工业场景中,甚至于作为许多大厂搭建推荐系统的基本参考。文中所体现的将具体问题抽象建模的过程思路富有逻辑,值得深入理解。

更多参考: